home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / sounds / tools / multiplayer-1.17.lzh / ChipMunch / src / chipmunch.c next >
C/C++ Source or Header  |  1991-07-23  |  2KB  |  78 lines

  1. /* ChipMunch - Move the first 512K of chip memory after the rest - Bryan Ford */
  2.  
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include <exec/execbase.h>
  6. #include <dos/dosextens.h>
  7. #include <workbench/startup.h>
  8. #include <proto/exec.h>
  9. #include <bry/macros.h>
  10.  
  11. struct ExecBase *SysBase;
  12.  
  13. struct Process *proc;
  14.     
  15. int __saveds entry(void)
  16.     {
  17.     struct MemHeader *mh, *nmh;
  18.     struct MemChunk *mc, *nmc;
  19.     struct WBStartup *wbs = 0L;
  20.     int ret = 10;
  21.         
  22.         SysBase = *((struct ExecBase**)4);
  23.         proc = FindTask(0L);
  24.         
  25.         if(!(proc->pr_CLI))
  26.             {
  27.                 WaitPort(&proc->pr_MsgPort);
  28.                 wbs = GetMsg(&proc->pr_MsgPort);
  29.             }
  30.         
  31.         Forbid();
  32.         for(mh = SysBase->MemList.lh_Head;;mh = mh->mh_Node.ln_Succ)
  33.             {
  34.                 if(!(mh->mh_Node.ln_Succ))
  35.                     break;
  36.                 if((mh->mh_Lower < (void*)0x40000) && (mh->mh_Upper > (void*)0x80000) && (mh->mh_Attributes & MEMF_CHIP))
  37.                     {
  38.                         if(!(nmh = AllocAbs(sizeof(*nmh),(void*)0x80000)))
  39.                             break;
  40.                         memset(nmh,0,sizeof(*nmh));
  41.                         nmh->mh_Node.ln_Type = NT_MEMORY;
  42.                         nmh->mh_Node.ln_Pri = mh->mh_Node.ln_Pri+1;
  43.                         nmh->mh_Attributes = mh->mh_Attributes;
  44.                         for(mc = mh->mh_First;;mc = nmc)
  45.                             {
  46.                                 if(!mc)
  47.                                     break;
  48.                                 if((long)(nmc = mc->mc_Next) > (long)nmh)
  49.                                     {
  50.                                         mc->mc_Next = 0L;
  51.                                         nmh->mh_First = nmc;
  52.                                         nmh->mh_Upper = mh->mh_Upper;
  53.                                         mh->mh_Upper = nmh;
  54.                                         nmh->mh_Lower = nmh+1;
  55.                                         for(mc = nmc;mc;mc = mc->mc_Next)
  56.                                             {
  57.                                                 mh->mh_Free -= mc->mc_Bytes;
  58.                                                 nmh->mh_Free += mc->mc_Bytes;
  59.                                             }
  60.                                         Insert(&SysBase->MemList,nmh,mh->mh_Node.ln_Pred->ln_Pred ? mh->mh_Node.ln_Pred : 0L);
  61.                                         ret = 0;
  62.                                         break;
  63.                                     }
  64.                             }
  65.                         break;
  66.                     }
  67.             }
  68.         Permit();
  69.         
  70.         if(wbs)
  71.             {
  72.                 Forbid();
  73.                 ReplyMsg(wbs);
  74.             }
  75.         return(ret);
  76.     }
  77.  
  78.